<?php
/**
 * Ly - 系统核心类
 *
 * 系统关键核心类，系统入口类，用于调度其他类
 *
 * Copyright (c) 2013 YinHailin All rights reserved.
 * @Author: YinHailin
 * @Authorize: Boren Network
 * @Created by YinHailin at 2013-11-01
 */

defined('LY_VERSION') or exit();

class LyCore {

  private static $_Instance = array();

  /*
   * 应用程序初始化
   * @return void
   */
  static public function Init() {
    //错误和异常处理
    register_shutdown_function(array('LyCore', 'FatalError'));
    set_error_handler(array('LyCore','AppError'));
    //注册AUTOLOAD方法
    spl_autoload_register(array('LyCore', 'Autoload'));
    //加载系统配置
    $list = array(
      LY_PATH.'Conf/Usual.conf.php',  //惯例配置
      ROOT_PATH.'Conf/Config.conf.php',  //自定义配置
    );
    foreach ($list as $conf) {
      if (is_file($conf)) {
        $conf = require $conf;
        C($conf);
      } else {
        halt('配置文件'.$conf.'缺失，系统无法正常运行', __FILE__, __LINE__);
      }
    }
    //加载自定义扩展文件
    load_ext_file();
    //设置系统时区
    date_default_timezone_set(C('DEFAULT_TIMEZONE'));
    //开始项目运行
    AppCore::Start();
  }

  /*
   * 系统自动加载方法
   * @param string $class 对象类名
   * @return void
   */
  public static function Autoload($class) {
    $file = $class.'.class.php';
    if (substr($class, -4)=='Core') {
      //加载核心类
      if (require_cache(CORE_PATH.$file)) {
        return ;
      }
    } else if (substr($class, -2)=='Db') {
      //加载数据库驱动
      if (require_cache(LY_PATH.'Class/Db/'.$file)) {
        return ;
      }
    } elseif (substr($class, -6)=='Taglib') {
      //加载标签库驱动
      if (require_cache(LY_PATH.'Class/TagLib/'.$file)) {
        return ;
      }
    } elseif (substr($class, -3)=='Mod') {
      //加载项目LIB库
      if (require_cache(LIB_PATH.$file)) {
        return ;
      }
      if (require_cache(EXTEND_PATH.'Class/'.$file)) {
        return ;
      }
    } else {
      //加载项目LIB库
      if (require_cache(EXTEND_PATH.'Class/'.$file)) {
        return ;
      }
    }
  }

  /*
   * 取得对象实例 支持调用类的静态方法
   * @param string $class 对象类名
   * @param string $method 类的静态方法名
   * @return object
   */
  static public function Instance($class, $method='') {
    $identifier = $class.$method;
    if (!isset(self::$_Instance[$identifier])) {
      self::$_Instance[$identifier] = get_instance_of($class, $method);
    }
    return self::$_Instance[$identifier];
  }

  /*
   * 异常处理
   * @param string $errno 错误号
   * @param string $errstr 错误描述
   * @param string $errfile 错误文件
   * @param string $errline 错误行号
   */
  static public function AppError($errType, $errMessage, $errFile, $errLine) {
    switch ($errType) {
      case E_ERROR:
      case E_PARSE:
      case E_CORE_ERROR:
      case E_COMPILE_ERROR:
      case E_USER_ERROR:
        shutdown($errType, $errMessage, $errFile, $errLine);
        break;
    }
  }

  static public function FatalError() {
    if ($error = error_get_last()) {
      LyCore::AppError($error['type'], $error['message'], $error['file'], $error['line']);
    }
  }
}